#include "../comment.h"

char currentUserName[128] = {0};

int isBigOrder()
{
     unsigned int x = 0x04030102;
     if(*(char *)&x == 2)
     {
          return 0;
     }
     else
     {
          return 1;
     }
}

//传一个小端字节序进去，返回大端字节序
unsigned int smallToBig(unsigned int data)
{
     unsigned char * p = (unsigned char *)&data;
     //把四个字节交换一下位置即可
     unsigned char temp = p[0];
     p[0] = p[3];
     p[3] = temp;
     temp = p[1];
     p[1] = p[2];
     p[2] = temp;
     return data;
}

//用于
void press(char *arr)
{
     printf("%s,按任意键继续\n",arr);
     getchar();
     getchar();
     system("clear");
}

int main()
{
     //服务器的地址
     unsigned int ip;
     //把字符串IP转为网络（大端）字节序
     inet_pton(AF_INET,"192.168.95.128",&ip);
     struct sockaddr_in addr;
     addr.sin_family = AF_INET;//IPV4地址族
     addr.sin_port = htons(9000);//转成网络字节序的端口号
     addr.sin_addr.s_addr = ip;//网络字节序IP地址

     // 如果要通信，就需要创建socket，返回SOCKET的文件描述符
     //参数1：地址族IPV4
     //参数2：流式SOCKET(tcp协议)
     //参数3：自动网络协议
     int fd = socket(AF_INET,SOCK_STREAM,0);
     //连接服务器
     //参数1：用来通信的SOCEKT
     //参数2：服务器的地址
     //参数3：服务器的地址结构体长度
     if(-1 == connect(fd,(struct sockaddr *)&addr,sizeof(addr)))
     {
          printf("连接服务器出错，服务器没有开或者断网了?\n");
     }
     // pid_t pid = fork();
     // if(pid>0)
     // {
          while (1)
          {
               //定义一个网络用的结构体，里面有消息类型和消息内容
               NETNODE netNode;

               printf("1.注册 2.登录 0.退出\n");
               char buf[8] ;
               scanf("%s",buf);
               if(strcmp(buf,"1")==0)//注册
               {
                    //把通信用的结构体的类型设置为注册
                    //该结构体还有1023个字节没有使用（content）
                    netNode.type = REGISTER;

                    //定义一个用户结构体
                    USERINFO user;
                    printf("请输入用户名\n");
                    scanf("%s",user.name);
                    printf("请输入密码\n");
                    scanf("%s",user.pwd);
                    printf("请输入手机号\n");
                    scanf("%s",user.tel);

                    //把用户信息结构体里面的所有字节全部拷贝到通信结构体的CONTENT中
                    memcpy(netNode.content,&user,sizeof(user));
                    //把结构体发给服务器
                    write(fd,&netNode,MSG_BUF_SIZE);
                    //马上等待服务器的应答
                    read(fd,&netNode,MSG_BUF_SIZE);
                    if(netNode.type == OK)
                    {
                         printf("服务器应答注册成功\n");
                         strcpy(currentUserName,user.name);
                    }
                    else
                    {
                         printf("服务器应答注册失败\n");
                         printf("%s",netNode.content);
                         press("注册失败了");

                    }
               }
               else if(strcmp(buf,"2")==0)
               {
                    netNode.type = LOGIN;
                    
                    //定义一个用户结构体
                    USERINFO user;
                    printf("请输入用户名\n");
                    scanf("%s",user.name);
                    printf("请输入密码\n");
                    scanf("%s",user.pwd);

                    //把用户信息结构体里面的所有字节全部拷贝到通信结构体的CONTENT中
                    memcpy(netNode.content,&user,sizeof(user));

                    //把结构体发给服务器
                    write(fd,&netNode,MSG_BUF_SIZE);
                    //马上等待服务器的应答
                    read(fd,&netNode,MSG_BUF_SIZE);
                    if(netNode.type == OK)
                    {
                         press("恭喜你登录成功");
                         //登录成功后保存当前的用户名，如果用户名不为空，也代表当前有用户登录了
                         strcpy(currentUserName,user.name);


                         while (1)
                         {
                              printf("3.单聊 4.群聊 5.修改密码 6.我的群聊记录 7.我的单聊记录  \n");//0.退出
                              scanf("%s",buf);
                              if(strcmp(buf,"3")==0)
                              {
                                   netNode.type = CHAT;
                                   CHAT_NODE cn;
                                   //把当前登录的名字设置为结构体中自己的名字
                                   strcpy(cn.self,currentUserName);
                                   printf("请输入对方的名字\n");
                                   scanf("%s",cn.dest);
                                   // //pd
                                   // memcpy(netNode.content,&cn,sizeof(cn));
                                   // write(fd,&netNode,MSG_BUF_SIZE);
                                   // read(fd,&netNode,MSG_BUF_SIZE);
                                   // int count = *(int*)netNode.content ;
                                   // printf("共有%d未读消息\n",count);
                                   // if (count!=0)
                                   // {
                                   // for (int i = 0; i < count; i++)
                                   // {
                                   //      read(fd,&netNode,MSG_BUF_SIZE);
                                   //      TC * tc = (TC *)netNode.content ;//表内容记录
                                   //      printf("%s: %s\n",cn.dest,tc->text);
                                   // }  
                                   // }
 
                                   // if (netNode.type != NO)
                                   // {                
                                   //把聊天的相关内容发送给服务器，让服务器去找我们想聊天的对象
                                   // write(fd,&netNode,MSG_BUF_SIZE);

                                   pid_t pid = fork();
                                   //在父进程中发消息
                                   if(pid > 0)
                                   {
                                        printf("进入聊天\n");
                                        while (1)
                                        {
                                             //直接把用户输入的字符串存入到通信结构体的内容区
                                             // scanf("%s",netNode.content);
                                             // printf("发送消息:");
                                             scanf("%s",cn.text);                                             
                                             //输入quit代表退出聊天
                                             if(strcmp("quit",cn.text) == 0)
                                             {
                                                  sprintf(cn.text,"用户%s退出单聊！",currentUserName);
                                                  memcpy(netNode.content,&cn,sizeof(cn));
                                                  //把退出聊天的信息发给服务器
                                                  write(fd,&netNode,MSG_BUF_SIZE);                                   
                                                  //关闭子进程和自己
                                                  kill(pid,SIGKILL);          
                                                  break;
                                             }
                                             else
                                             {
                                                  memcpy(netNode.content,&cn,sizeof(cn));
                                                  //把聊天信息发给服务器
                                                  write(fd,&netNode,MSG_BUF_SIZE);
                                             }
                                        }
                                        press("已退出聊天界面");                         
                                   }
                                   else//子进程中接收消息
                                   {
                                        while (1)
                                        {
                                             char buf[MSG_BUF_SIZE];
                                             int ret = read(fd,buf,MSG_BUF_SIZE);
                                             if(ret == 0 || ret == -1)
                                             {
                                                  break;
                                             }
                                             //首先把字节转为通信结构体
                                             NETNODE* pNode = (NETNODE*)buf;
                                             //打印出结构体中的内容
                                             printf("%s\n",pNode->content);
                                        }
                                   }                         
                                   // }
                                   // else
                                   // press("对方未上线！");
                              }
                              else if(strcmp(buf,"4")==0)
                              {
                                   netNode.type = CHAT_GROUP;
                                   GCHAT_NODE gchat;
                                   strcpy(gchat.self,currentUserName);
                                   strcpy(gchat.dest,"anyone");
                                   sprintf(gchat.text,"用户%s加入群聊！",currentUserName);
                                   memcpy(netNode.content,&gchat,sizeof(gchat));
                                   write(fd,&netNode,MSG_BUF_SIZE);
                                   //因为聊天需要一边发一边收消息，所以需要请一个子进程帮忙
                                   pid_t pid = fork();
                                   //在父进程中发消息
                                   if(pid > 0)
                                   {   
                                        while (1)
                                        {                              
                                             //直接把用户输入的字符串存入到通信结构体的内容区
                                             scanf("%s",gchat.text);
                                             //输入quit代表退出聊天
                                             if(strcmp("quit",gchat.text) == 0)
                                             {
                                                  // sprintf(gchat.text,"用户%s退出聊天！",currentUserName);
                                                  //把退出聊天的信息发给服务器
                                                  memcpy(netNode.content,&gchat,sizeof(gchat));
                                                  write(fd,&netNode,MSG_BUF_SIZE);
                                                  //关闭子进程和自己
                                                  kill(pid,SIGKILL);
                                                  break;
                                             }
                                             else
                                             {
                                                  //把聊天信息发给服务器
                                                  // char sp[1023];                              
                                                  // sprintf(sp,"-%s:",currentUserName);
                                                  // strcat(sp,netNode.content);
                                                  // strcpy(netNode.content,sp);
                                                  memcpy(netNode.content,&gchat,sizeof(gchat));
                                                  write(fd,&netNode,MSG_BUF_SIZE);
                                                  
                                             }
                                        }   
                                        press("已退出");                      
                                   }
                                   else//子进程中接收消息
                                   {
                                        while (1)
                                        {
                                             char buf[MSG_BUF_SIZE];
                                             int ret = read(fd,buf,MSG_BUF_SIZE);
                                             if(ret == 0 || ret == -1)
                                             {
                                                  break;
                                             }
                                             //首先把字节转为通信结构体
                                             NETNODE* pNode = (NETNODE*)buf;
                                             //打印出结构体中的内容
                                             printf("%s\n",pNode->content);
                                        }
                                   }
                              }
                              else if(strcmp(buf,"5")==0)
                              {
                                   netNode.type = MODIFY_PWD ;
                                   USERINFO user ;
                                   strcpy(user.name,currentUserName);
                                   printf("验证旧密码\n");
                                   scanf("%s",user.pwd);
                                   //将验证信息存入结构体内容
                                   memcpy(&netNode.content,&user,sizeof(user));
                                   write(fd,&netNode,MSG_BUF_SIZE); //发送填写的验证信息
                                   pid_t pid = fork();
                                   if(pid>0)
                                   {
                                        printf("输入新密码\n");
                                        scanf("%s",user.pwd);
                                        write(fd,&user,sizeof(user)); //发送新的密码
                                        

                                   }
                                   else    
                                   {    
                                        while(1)
                                        {
                                             read(fd,&netNode,MSG_BUF_SIZE);
                                             if ( netNode.type==OK )    //判断验证信息是否正确
                                             {
                                                  press("密码修改成功！");
                                                  break;
                                             }
                                             else
                                             {
                                                  press("密码验证错误！");
                                                  break;
                                             }
                                        }  
                                   }  
                                   // kill(pid,SIGKILL);                                                                      
                              }
                              else if(strcmp(buf,"6")==0)
                              {
                                   netNode.type = SINGEL_GROUP ;
                                   strcpy(netNode.content,currentUserName);
                                   write(fd,&netNode,MSG_BUF_SIZE);
                                   read(fd,&netNode,MSG_BUF_SIZE);
                                   int count = *(int*)netNode.content ;
                                   printf("%s共有%d消息记录\n",currentUserName,count);
                                   for (int i = 0; i < count; i++)
                                   {
                                        read(fd,&netNode,MSG_BUF_SIZE);
                                        TC * tc = (TC *)netNode.content ;//表内容记录
                                        printf("%s %s %s\n",tc->self,tc->text,tc->datatime);
                                   }
                                   press("查看完毕");
                              } 
                              else if(strcmp(buf,"7")==0)
                              {
                                   netNode.type = SINGEL_CHAT ;
                         
                                   strcpy(netNode.content,currentUserName);
                                   write(fd,&netNode,MSG_BUF_SIZE);
                                   read(fd,&netNode,MSG_BUF_SIZE);
                                   int count = *(int*)netNode.content ;
                                   printf("%s共有%d消息记录\n",currentUserName,count);
                                   for (int i = 0; i < count; i++)
                                   {
                                        read(fd,&netNode,MSG_BUF_SIZE);
                                        TC * tc = (TC *)netNode.content ;//表内容记录
                                        printf("%s %s %s %s\n",tc->self,tc->dest,tc->text,tc->datatime);
                                   }
                                   press("查看完毕");
                              } 
                                                         
                              else if(strcmp(buf,"0")==0)
                              {
                                   break;
                              }
                         }                         
                    }
                    else
                    {
                         printf("用户名或者密码错误\n");
                    }
                    press("执行完毕");
               }
               else if(strcmp(buf,"0")==0)
               {
                    break;
               }
          }         
     return 0;
}